{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Accompanying code examples of the book \"Introduction to Artificial Neural Networks and Deep Learning: A Practical Guide with Applications in Python\" by [Sebastian Raschka](https://sebastianraschka.com). All code examples are released under the [MIT license](https://github.com/rasbt/deep-learning-book/blob/master/LICENSE). If you find this content useful, please consider supporting the work by buying a [copy of the book](https://leanpub.com/ann-and-deeplearning).*\n",
    "  \n",
    "Other code examples and content are available on [GitHub](https://github.com/rasbt/deep-learning-book). The PDF and ebook versions of the book are available through [Leanpub](https://leanpub.com/ann-and-deeplearning)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sebastian Raschka \n",
      "\n",
      "CPython 3.6.1\n",
      "IPython 6.0.0\n",
      "\n",
      "tensorflow 1.2.0\n"
     ]
    }
   ],
   "source": [
    "%load_ext watermark\n",
    "%watermark -a 'Sebastian Raschka' -v -p tensorflow"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Model Zoo -- General Adversarial Networks"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Implementation of General Adversarial Nets (GAN) where both the discriminator and generator are multi-layer perceptrons with one hidden layer only. In this example, the GAN generator was trained to generate MNIST images.\n",
    "\n",
    "Uses\n",
    "\n",
    "- samples from a random normal distribution (range [-1, 1])\n",
    "- dropout\n",
    "- leaky relus\n",
    "- ~~batch normalization~~ [performs worse here]\n",
    "- separate batches for \"fake\" and \"real\" images (where the labels are 1 = real images, 0 = fake images)\n",
    "- MNIST images normalized to [-1, 1] range\n",
    "- generator with tanh output\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/gpu:0'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "import pickle as pkl\n",
    "\n",
    "tf.test.gpu_device_name()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting MNIST_data/train-images-idx3-ubyte.gz\n",
      "Extracting MNIST_data/train-labels-idx1-ubyte.gz\n",
      "Extracting MNIST_data/t10k-images-idx3-ubyte.gz\n",
      "Extracting MNIST_data/t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "### Abbreviatiuons\n",
    "# dis_*: discriminator network\n",
    "# gen_*: generator network\n",
    "\n",
    "########################\n",
    "### Helper functions\n",
    "########################\n",
    "\n",
    "def leaky_relu(x, alpha=0.0001):\n",
    "    return tf.maximum(alpha * x, x)\n",
    "\n",
    "\n",
    "########################\n",
    "### DATASET\n",
    "########################\n",
    "\n",
    "mnist = input_data.read_data_sets('MNIST_data')\n",
    "\n",
    "\n",
    "#########################\n",
    "### SETTINGS\n",
    "#########################\n",
    "\n",
    "# Hyperparameters\n",
    "learning_rate = 0.001\n",
    "training_epochs = 100\n",
    "batch_size = 64\n",
    "dropout_rate = 0.5\n",
    "\n",
    "# Other settings\n",
    "print_interval = 200\n",
    "\n",
    "# Architecture\n",
    "dis_input_size = 784\n",
    "gen_input_size = 100\n",
    "\n",
    "dis_hidden_size = 128\n",
    "gen_hidden_size = 128\n",
    "\n",
    "\n",
    "#########################\n",
    "### GRAPH DEFINITION\n",
    "#########################\n",
    "\n",
    "g = tf.Graph()\n",
    "with g.as_default():\n",
    "    \n",
    "    # Placeholders for settings\n",
    "    dropout = tf.placeholder(tf.float32, shape=None, name='dropout')\n",
    "    is_training = tf.placeholder(tf.bool, shape=None, name='is_training')\n",
    "    \n",
    "    # Input data\n",
    "    dis_x = tf.placeholder(tf.float32, shape=[None, dis_input_size], name='discriminator_input') \n",
    "    gen_x = tf.placeholder(tf.float32, [None, gen_input_size], name='generator_input')\n",
    "\n",
    "\n",
    "    ##################\n",
    "    # Generator Model\n",
    "    ##################\n",
    "\n",
    "    with tf.variable_scope('generator'):\n",
    "        # linear -> ~~batch norm~~ -> leaky relu -> dropout -> tanh output\n",
    "        gen_hidden = tf.layers.dense(inputs=gen_x, units=gen_hidden_size,\n",
    "                                      activation=None)\n",
    "        #gen_hidden = tf.layers.batch_normalization(gen_hidden, training=is_training)\n",
    "        gen_hidden = leaky_relu(gen_hidden)\n",
    "        gen_hidden = tf.layers.dropout(gen_hidden, rate=dropout_rate)\n",
    "        gen_logits = tf.layers.dense(inputs=gen_hidden, units=dis_input_size, \n",
    "                                     activation=None)\n",
    "        gen_out = tf.tanh(gen_logits, 'generator_output')\n",
    "\n",
    "\n",
    "    ######################\n",
    "    # Discriminator Model\n",
    "    ######################\n",
    "    \n",
    "    def build_discriminator_graph(input_x, reuse=None):\n",
    "        # linear -> ~~batch norm~~ -> leaky relu -> dropout -> sigmoid output\n",
    "        with tf.variable_scope('discriminator', reuse=reuse):\n",
    "            hidden = tf.layers.dense(inputs=input_x, units=dis_hidden_size, \n",
    "                                     activation=None)\n",
    "            #hidden = tf.layers.batch_normalization(hidden, training=is_training)\n",
    "            hidden = leaky_relu(hidden)\n",
    "            hidden = tf.layers.dropout(hidden, rate=dropout_rate)\n",
    "            logits = tf.layers.dense(inputs=hidden, units=1, activation=None)\n",
    "            out = tf.sigmoid(logits)\n",
    "        return logits, out    \n",
    "\n",
    "    # Create a discriminator for real data and a discriminator for fake data\n",
    "    dis_real_logits, dis_real_out = build_discriminator_graph(dis_x, reuse=False)\n",
    "    dis_fake_logits, dis_fake_out = build_discriminator_graph(gen_out, reuse=True)\n",
    "\n",
    "\n",
    "    #####################################\n",
    "    # Generator and Discriminator Losses\n",
    "    #####################################\n",
    "    \n",
    "    # Two discriminator cost components: loss on real data + loss on fake data\n",
    "    # Real data has class label 0, fake data has class label 1\n",
    "    dis_real_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=dis_real_logits, \n",
    "                                                            labels=tf.zeros_like(dis_real_logits))\n",
    "    dis_fake_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=dis_fake_logits, \n",
    "                                                            labels=tf.ones_like(dis_fake_logits))\n",
    "    dis_cost = tf.add(tf.reduce_mean(dis_fake_loss), \n",
    "                      tf.reduce_mean(dis_real_loss), \n",
    "                      name='discriminator_cost')\n",
    " \n",
    "    # Generator cost: difference between dis. prediction and label \"0\" for real images\n",
    "    gen_loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=dis_fake_logits,\n",
    "                                                       labels=tf.zeros_like(dis_fake_logits))\n",
    "    gen_cost = tf.reduce_mean(gen_loss, name='generator_cost')\n",
    "    \n",
    "    \n",
    "    #########################################\n",
    "    # Generator and Discriminator Optimizers\n",
    "    #########################################\n",
    "      \n",
    "    dis_optimizer = tf.train.AdamOptimizer(learning_rate)\n",
    "    dis_train_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='discriminator')\n",
    "    dis_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, scope='discriminator')\n",
    "    \n",
    "    with tf.control_dependencies(dis_update_ops): # required to upd. batch_norm params\n",
    "        dis_train = dis_optimizer.minimize(dis_cost, var_list=dis_train_vars,\n",
    "                                           name='train_discriminator')\n",
    "    \n",
    "    gen_optimizer = tf.train.AdamOptimizer(learning_rate)\n",
    "    gen_train_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='generator')\n",
    "    gen_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, scope='generator')\n",
    "    \n",
    "    with tf.control_dependencies(gen_update_ops): # required to upd. batch_norm params\n",
    "        gen_train = gen_optimizer.minimize(gen_cost, var_list=gen_train_vars,\n",
    "                                           name='train_generator')\n",
    "    \n",
    "    # Saver to save session for reuse\n",
    "    saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minibatch: 001 | Dis/Gen Cost:    1.780/0.862\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.066/3.259\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.070/2.861\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.029/4.033\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.046/4.097\n",
      "Epoch:     001 | Dis/Gen AvgCost: 0.132/3.455\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.019/4.750\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.178/6.108\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.376/6.452\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.637/5.819\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.683/2.401\n",
      "Epoch:     002 | Dis/Gen AvgCost: 0.484/4.612\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.679/1.947\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.910/2.279\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.314/6.992\n",
      "Minibatch: 601 | Dis/Gen Cost:    2.658/2.182\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.541/3.430\n",
      "Epoch:     003 | Dis/Gen AvgCost: 1.345/3.748\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.549/2.604\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.511/1.262\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.741/1.563\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.765/2.525\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.689/3.023\n",
      "Epoch:     004 | Dis/Gen AvgCost: 1.433/2.474\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.466/4.496\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.259/2.413\n",
      "Minibatch: 401 | Dis/Gen Cost:    2.494/1.687\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.594/2.020\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.865/2.784\n",
      "Epoch:     005 | Dis/Gen AvgCost: 1.739/2.148\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.168/1.676\n",
      "Minibatch: 201 | Dis/Gen Cost:    2.473/1.964\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.211/2.805\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.530/1.776\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.437/1.472\n",
      "Epoch:     006 | Dis/Gen AvgCost: 1.203/1.873\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.515/1.205\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.286/1.904\n",
      "Minibatch: 401 | Dis/Gen Cost:    3.037/1.770\n",
      "Minibatch: 601 | Dis/Gen Cost:    3.007/0.651\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.275/1.222\n",
      "Epoch:     007 | Dis/Gen AvgCost: 1.617/1.847\n",
      "Minibatch: 001 | Dis/Gen Cost:    3.702/0.770\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.513/1.432\n",
      "Minibatch: 401 | Dis/Gen Cost:    2.323/1.038\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.923/1.478\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.981/1.738\n",
      "Epoch:     008 | Dis/Gen AvgCost: 1.583/1.475\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.755/1.464\n",
      "Minibatch: 201 | Dis/Gen Cost:    2.534/0.682\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.389/2.116\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.794/1.148\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.885/1.312\n",
      "Epoch:     009 | Dis/Gen AvgCost: 1.543/1.312\n",
      "Minibatch: 001 | Dis/Gen Cost:    2.486/1.028\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.970/1.257\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.773/1.811\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.385/2.397\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.848/1.614\n",
      "Epoch:     010 | Dis/Gen AvgCost: 1.300/1.457\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.750/2.874\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.350/1.093\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.555/1.231\n",
      "Minibatch: 601 | Dis/Gen Cost:    3.670/0.780\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.989/1.421\n",
      "Epoch:     011 | Dis/Gen AvgCost: 1.429/1.574\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.472/1.077\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.965/1.482\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.503/0.949\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.551/1.123\n",
      "Minibatch: 801 | Dis/Gen Cost:    2.052/0.743\n",
      "Epoch:     012 | Dis/Gen AvgCost: 1.483/1.288\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.124/2.665\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.834/1.620\n",
      "Minibatch: 401 | Dis/Gen Cost:    2.035/0.633\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.142/1.386\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.931/1.347\n",
      "Epoch:     013 | Dis/Gen AvgCost: 1.223/1.466\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.352/1.303\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.251/0.909\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.588/1.875\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.195/1.276\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.959/1.229\n",
      "Epoch:     014 | Dis/Gen AvgCost: 1.338/1.501\n",
      "Minibatch: 001 | Dis/Gen Cost:    2.029/1.585\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.142/1.855\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.551/2.388\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.890/1.969\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.226/2.037\n",
      "Epoch:     015 | Dis/Gen AvgCost: 1.038/1.895\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.846/1.996\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.951/2.238\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.646/2.625\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.420/2.272\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.839/2.226\n",
      "Epoch:     016 | Dis/Gen AvgCost: 1.055/2.257\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.169/3.084\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.032/2.305\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.854/2.547\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.745/2.899\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.884/2.722\n",
      "Epoch:     017 | Dis/Gen AvgCost: 1.193/2.179\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.647/1.778\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.012/2.455\n",
      "Minibatch: 401 | Dis/Gen Cost:    2.399/2.018\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.506/1.272\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.159/1.535\n",
      "Epoch:     018 | Dis/Gen AvgCost: 1.253/2.117\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.806/2.746\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.285/1.397\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.913/2.332\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.708/2.289\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.048/1.899\n",
      "Epoch:     019 | Dis/Gen AvgCost: 1.148/1.803\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.340/1.754\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.093/2.140\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.377/2.535\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.162/1.228\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.984/2.376\n",
      "Epoch:     020 | Dis/Gen AvgCost: 1.226/2.420\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.079/1.913\n",
      "Minibatch: 201 | Dis/Gen Cost:    2.455/1.342\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.878/1.877\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.826/3.046\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.529/2.150\n",
      "Epoch:     021 | Dis/Gen AvgCost: 1.114/2.047\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.082/1.645\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.352/1.737\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.457/2.237\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.086/2.139\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.823/1.261\n",
      "Epoch:     022 | Dis/Gen AvgCost: 1.078/2.121\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.016/2.645\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.269/2.270\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.908/2.490\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.631/2.977\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.711/2.269\n",
      "Epoch:     023 | Dis/Gen AvgCost: 1.135/2.395\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.876/1.551\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.449/1.323\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.326/1.785\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.094/1.926\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.580/1.551\n",
      "Epoch:     024 | Dis/Gen AvgCost: 1.148/1.906\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.547/2.018\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.587/1.753\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.093/1.905\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.033/1.952\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.987/2.111\n",
      "Epoch:     025 | Dis/Gen AvgCost: 1.074/1.919\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.711/1.559\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.470/1.704\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.069/1.374\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.040/1.915\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.922/1.537\n",
      "Epoch:     026 | Dis/Gen AvgCost: 1.185/1.801\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.688/2.127\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.263/1.580\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.947/0.997\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.979/1.529\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.179/1.490\n",
      "Epoch:     027 | Dis/Gen AvgCost: 1.156/1.598\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.273/1.861\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.702/1.418\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.472/1.390\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.147/1.575\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.849/2.294\n",
      "Epoch:     028 | Dis/Gen AvgCost: 1.115/1.854\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.560/1.145\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.648/2.577\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.645/2.612\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.903/1.885\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.784/2.444\n",
      "Epoch:     029 | Dis/Gen AvgCost: 1.137/1.916\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.966/1.777\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.249/1.753\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.767/2.880\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.897/1.763\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.191/1.265\n",
      "Epoch:     030 | Dis/Gen AvgCost: 1.102/1.748\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.146/1.354\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.921/1.424\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.741/2.104\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.539/1.229\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.957/1.799\n",
      "Epoch:     031 | Dis/Gen AvgCost: 1.027/1.808\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.817/2.358\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.416/1.772\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.578/1.132\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.116/1.745\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.094/1.548\n",
      "Epoch:     032 | Dis/Gen AvgCost: 1.083/1.917\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.120/1.830\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.236/1.777\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.895/2.129\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.260/1.245\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.356/1.709\n",
      "Epoch:     033 | Dis/Gen AvgCost: 1.101/1.931\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.115/2.186\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.629/1.934\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.462/1.294\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.796/2.729\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.795/1.279\n",
      "Epoch:     034 | Dis/Gen AvgCost: 1.032/1.978\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.145/2.304\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.834/1.598\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.788/1.847\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.525/2.520\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.603/2.462\n",
      "Epoch:     035 | Dis/Gen AvgCost: 0.952/1.909\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.453/1.804\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.615/2.529\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.963/1.911\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.063/1.767\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.079/2.067\n",
      "Epoch:     036 | Dis/Gen AvgCost: 1.008/1.913\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.899/1.768\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.426/1.211\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.635/2.328\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.848/1.690\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.112/1.951\n",
      "Epoch:     037 | Dis/Gen AvgCost: 0.905/2.041\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.201/2.162\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.934/2.198\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.189/1.820\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.661/2.764\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.877/2.538\n",
      "Epoch:     038 | Dis/Gen AvgCost: 0.926/2.152\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.790/2.876\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.961/2.681\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.004/1.591\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.159/1.871\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.143/2.435\n",
      "Epoch:     039 | Dis/Gen AvgCost: 0.933/2.113\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.065/2.207\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.077/2.460\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.781/2.020\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.728/1.683\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.206/1.962\n",
      "Epoch:     040 | Dis/Gen AvgCost: 0.892/2.155\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.843/2.610\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.554/2.574\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.033/2.384\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.915/1.953\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.902/2.436\n",
      "Epoch:     041 | Dis/Gen AvgCost: 0.935/2.005\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.916/1.967\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.309/1.805\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.461/1.443\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.832/2.506\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.930/1.799\n",
      "Epoch:     042 | Dis/Gen AvgCost: 0.940/2.052\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.744/2.433\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.209/1.894\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.025/1.804\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.947/1.629\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.111/1.628\n",
      "Epoch:     043 | Dis/Gen AvgCost: 0.925/1.994\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.931/1.860\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.752/1.858\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.885/1.572\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.009/2.137\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.264/2.319\n",
      "Epoch:     044 | Dis/Gen AvgCost: 0.921/1.975\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.392/1.757\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.931/1.696\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.783/1.908\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.870/2.053\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.740/1.557\n",
      "Epoch:     045 | Dis/Gen AvgCost: 0.934/2.042\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.182/1.813\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.008/2.248\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.837/2.026\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.179/1.756\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.081/2.034\n",
      "Epoch:     046 | Dis/Gen AvgCost: 0.961/1.948\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.200/1.684\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.906/1.725\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.183/1.658\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.877/1.721\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.005/1.636\n",
      "Epoch:     047 | Dis/Gen AvgCost: 0.976/1.891\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.945/2.076\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.901/1.734\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.296/1.686\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.877/2.226\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.822/1.944\n",
      "Epoch:     048 | Dis/Gen AvgCost: 0.954/2.047\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.072/2.026\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.849/1.691\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.091/1.309\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.221/1.640\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.963/1.691\n",
      "Epoch:     049 | Dis/Gen AvgCost: 0.941/1.939\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.114/1.423\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.889/2.320\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.093/2.145\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.784/2.213\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.003/1.800\n",
      "Epoch:     050 | Dis/Gen AvgCost: 0.950/1.983\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.800/2.230\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.005/1.369\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.768/2.523\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.948/1.971\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.822/2.065\n",
      "Epoch:     051 | Dis/Gen AvgCost: 0.961/1.966\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.893/1.870\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.848/1.757\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.047/1.956\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.930/1.811\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.027/1.798\n",
      "Epoch:     052 | Dis/Gen AvgCost: 0.908/1.939\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.943/1.934\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.583/2.514\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.845/2.194\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.999/1.895\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.908/1.761\n",
      "Epoch:     053 | Dis/Gen AvgCost: 0.936/1.894\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.725/2.493\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.008/2.450\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.354/1.257\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.807/1.977\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.902/1.763\n",
      "Epoch:     054 | Dis/Gen AvgCost: 0.930/1.894\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.717/2.591\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.953/1.853\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.940/2.419\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.136/1.866\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.210/1.742\n",
      "Epoch:     055 | Dis/Gen AvgCost: 0.923/1.924\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.733/2.124\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.186/1.780\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.827/1.658\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.762/2.223\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.815/1.968\n",
      "Epoch:     056 | Dis/Gen AvgCost: 0.940/1.907\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.845/1.792\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.955/2.223\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.990/1.642\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.898/1.826\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.859/1.895\n",
      "Epoch:     057 | Dis/Gen AvgCost: 0.927/1.862\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.781/2.240\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.101/1.946\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.187/2.024\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.905/1.966\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.126/1.619\n",
      "Epoch:     058 | Dis/Gen AvgCost: 0.954/1.853\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.845/1.845\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.788/1.867\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.123/1.690\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.035/2.213\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.979/2.110\n",
      "Epoch:     059 | Dis/Gen AvgCost: 0.949/1.849\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.792/2.654\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.667/2.302\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.745/2.209\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.149/1.681\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.983/1.955\n",
      "Epoch:     060 | Dis/Gen AvgCost: 0.959/1.866\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.127/1.601\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.102/1.860\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.662/2.358\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.943/1.183\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.309/1.384\n",
      "Epoch:     061 | Dis/Gen AvgCost: 0.953/1.852\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.039/1.489\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.716/2.281\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.820/2.397\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.991/1.501\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.784/2.214\n",
      "Epoch:     062 | Dis/Gen AvgCost: 0.950/1.820\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.269/1.457\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.163/2.043\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.165/1.743\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.872/1.554\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.132/1.946\n",
      "Epoch:     063 | Dis/Gen AvgCost: 0.969/1.848\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.150/1.981\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.821/2.240\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.118/1.780\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.999/1.346\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.020/1.646\n",
      "Epoch:     064 | Dis/Gen AvgCost: 0.997/1.795\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.830/2.187\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.153/1.105\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.947/1.664\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.985/2.092\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.170/1.618\n",
      "Epoch:     065 | Dis/Gen AvgCost: 1.014/1.745\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.777/1.826\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.943/2.126\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.058/1.531\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.885/1.926\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.901/2.076\n",
      "Epoch:     066 | Dis/Gen AvgCost: 1.026/1.729\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.839/1.736\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.021/1.997\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.019/1.796\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.079/1.548\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.064/1.670\n",
      "Epoch:     067 | Dis/Gen AvgCost: 1.001/1.682\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.075/1.497\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.083/1.696\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.947/1.769\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.005/1.833\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.782/2.193\n",
      "Epoch:     068 | Dis/Gen AvgCost: 0.983/1.744\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.152/1.972\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.032/1.782\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.850/1.932\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.726/2.192\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.817/2.106\n",
      "Epoch:     069 | Dis/Gen AvgCost: 0.988/1.737\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.824/1.608\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.998/1.683\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.725/2.099\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.142/1.952\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.984/1.919\n",
      "Epoch:     070 | Dis/Gen AvgCost: 0.998/1.747\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.883/1.957\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.178/1.769\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.189/1.297\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.033/1.601\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.939/1.494\n",
      "Epoch:     071 | Dis/Gen AvgCost: 1.001/1.694\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.127/2.006\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.451/1.442\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.867/1.620\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.832/1.606\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.829/1.446\n",
      "Epoch:     072 | Dis/Gen AvgCost: 1.011/1.652\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.061/1.443\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.061/1.460\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.148/1.710\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.292/1.098\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.763/1.917\n",
      "Epoch:     073 | Dis/Gen AvgCost: 0.994/1.679\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.115/1.742\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.004/1.599\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.857/1.958\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.960/1.693\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.933/1.855\n",
      "Epoch:     074 | Dis/Gen AvgCost: 0.998/1.711\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.994/1.530\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.066/1.401\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.183/1.350\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.774/1.700\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.879/1.804\n",
      "Epoch:     075 | Dis/Gen AvgCost: 1.004/1.695\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.901/2.194\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.068/1.360\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.954/1.416\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.055/1.563\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.022/1.478\n",
      "Epoch:     076 | Dis/Gen AvgCost: 1.015/1.655\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.928/1.833\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.859/1.379\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.904/1.730\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.885/1.659\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.044/1.927\n",
      "Epoch:     077 | Dis/Gen AvgCost: 1.022/1.605\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.160/1.570\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.931/1.476\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.823/1.512\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.116/1.255\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.183/1.266\n",
      "Epoch:     078 | Dis/Gen AvgCost: 1.026/1.650\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.629/0.871\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.250/1.815\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.970/1.700\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.197/1.494\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.900/1.601\n",
      "Epoch:     079 | Dis/Gen AvgCost: 1.034/1.617\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.858/1.931\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.006/1.475\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.919/1.850\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.125/1.624\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.968/1.406\n",
      "Epoch:     080 | Dis/Gen AvgCost: 1.009/1.686\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.773/2.030\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.064/1.797\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.832/1.732\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.010/1.615\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.969/1.654\n",
      "Epoch:     081 | Dis/Gen AvgCost: 1.027/1.616\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.002/1.366\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.849/1.789\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.868/1.846\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.867/2.013\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.996/1.670\n",
      "Epoch:     082 | Dis/Gen AvgCost: 1.022/1.660\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.807/1.946\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.941/2.055\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.230/1.317\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.973/1.707\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.875/2.133\n",
      "Epoch:     083 | Dis/Gen AvgCost: 1.003/1.661\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.197/1.645\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.049/1.379\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.005/1.732\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.148/1.651\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.042/1.556\n",
      "Epoch:     084 | Dis/Gen AvgCost: 1.026/1.665\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.112/1.451\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.870/2.034\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.983/1.714\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.010/1.791\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.874/1.963\n",
      "Epoch:     085 | Dis/Gen AvgCost: 1.026/1.631\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.124/1.356\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.283/1.486\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.769/1.989\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.148/1.516\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.093/1.796\n",
      "Epoch:     086 | Dis/Gen AvgCost: 1.032/1.603\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.169/1.242\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.099/1.615\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.027/1.576\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.879/2.036\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.998/1.492\n",
      "Epoch:     087 | Dis/Gen AvgCost: 1.032/1.594\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.252/1.457\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.923/1.976\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.801/1.904\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.943/1.597\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.896/1.933\n",
      "Epoch:     088 | Dis/Gen AvgCost: 1.016/1.639\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.161/1.404\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.913/1.878\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.874/1.717\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.996/1.397\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.812/1.427\n",
      "Epoch:     089 | Dis/Gen AvgCost: 1.014/1.612\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.893/1.509\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.005/1.585\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.856/1.956\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.010/1.746\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.047/1.875\n",
      "Epoch:     090 | Dis/Gen AvgCost: 1.025/1.643\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.080/1.830\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.377/1.294\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.259/1.133\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.072/1.199\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.921/2.191\n",
      "Epoch:     091 | Dis/Gen AvgCost: 1.025/1.574\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.816/2.002\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.147/1.551\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.939/1.615\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.927/1.692\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.391/1.163\n",
      "Epoch:     092 | Dis/Gen AvgCost: 1.026/1.647\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.821/2.085\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.929/1.393\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.878/1.617\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.245/1.325\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.040/1.512\n",
      "Epoch:     093 | Dis/Gen AvgCost: 1.028/1.621\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.150/1.441\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.919/1.795\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.092/1.452\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.004/1.484\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.763/1.644\n",
      "Epoch:     094 | Dis/Gen AvgCost: 1.048/1.578\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.226/1.486\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.084/1.420\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.137/1.446\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.286/1.335\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.102/1.262\n",
      "Epoch:     095 | Dis/Gen AvgCost: 1.043/1.560\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.001/1.547\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.143/1.308\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.040/1.441\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.056/1.368\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.102/1.857\n",
      "Epoch:     096 | Dis/Gen AvgCost: 1.042/1.605\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.990/1.628\n",
      "Minibatch: 201 | Dis/Gen Cost:    1.153/1.578\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.261/1.422\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.132/1.440\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.113/1.186\n",
      "Epoch:     097 | Dis/Gen AvgCost: 1.036/1.596\n",
      "Minibatch: 001 | Dis/Gen Cost:    0.843/1.715\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.859/1.627\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.338/1.386\n",
      "Minibatch: 601 | Dis/Gen Cost:    1.175/1.362\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.981/1.795\n",
      "Epoch:     098 | Dis/Gen AvgCost: 1.043/1.522\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.207/1.046\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.825/2.073\n",
      "Minibatch: 401 | Dis/Gen Cost:    0.993/1.592\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.900/1.328\n",
      "Minibatch: 801 | Dis/Gen Cost:    1.460/0.950\n",
      "Epoch:     099 | Dis/Gen AvgCost: 1.031/1.576\n",
      "Minibatch: 001 | Dis/Gen Cost:    1.285/1.358\n",
      "Minibatch: 201 | Dis/Gen Cost:    0.938/1.483\n",
      "Minibatch: 401 | Dis/Gen Cost:    1.046/1.356\n",
      "Minibatch: 601 | Dis/Gen Cost:    0.920/1.609\n",
      "Minibatch: 801 | Dis/Gen Cost:    0.862/1.739\n",
      "Epoch:     100 | Dis/Gen AvgCost: 1.030/1.569\n"
     ]
    }
   ],
   "source": [
    "##########################\n",
    "### TRAINING & EVALUATION\n",
    "##########################\n",
    "\n",
    "with tf.Session(graph=g) as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    avg_costs = {'discriminator': [], 'generator': []}\n",
    "\n",
    "    for epoch in range(training_epochs):\n",
    "        dis_avg_cost, gen_avg_cost = 0., 0.\n",
    "        total_batch = mnist.train.num_examples // batch_size\n",
    "\n",
    "        for i in range(total_batch):\n",
    "            \n",
    "            batch_x, batch_y = mnist.train.next_batch(batch_size)\n",
    "            batch_x = batch_x*2 - 1 # normalize\n",
    "            batch_randsample = np.random.uniform(-1, 1, size=(batch_size, gen_input_size))\n",
    "            \n",
    "            # Train\n",
    "            _, dc = sess.run(['train_discriminator', 'discriminator_cost:0'],\n",
    "                             feed_dict={'discriminator_input:0': batch_x, \n",
    "                                        'generator_input:0': batch_randsample,\n",
    "                                        'dropout:0': dropout_rate,\n",
    "                                        'is_training:0': True})\n",
    "            _, gc = sess.run(['train_generator', 'generator_cost:0'],\n",
    "                             feed_dict={'generator_input:0': batch_randsample,\n",
    "                                        'dropout:0': dropout_rate,\n",
    "                                        'is_training:0': True})\n",
    "            \n",
    "            dis_avg_cost += dc\n",
    "            gen_avg_cost += gc\n",
    "\n",
    "            if not i % print_interval:\n",
    "                print(\"Minibatch: %03d | Dis/Gen Cost:    %.3f/%.3f\" % (i + 1, dc, gc))\n",
    "                \n",
    "\n",
    "        print(\"Epoch:     %03d | Dis/Gen AvgCost: %.3f/%.3f\" % \n",
    "              (epoch + 1, dis_avg_cost / total_batch, gen_avg_cost / total_batch))\n",
    "        \n",
    "        avg_costs['discriminator'].append(dis_avg_cost / total_batch)\n",
    "        avg_costs['generator'].append(gen_avg_cost / total_batch)\n",
    "    \n",
    "    \n",
    "    saver.save(sess, save_path='./gan.ckpt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fdaa4482f28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.plot(range(len(avg_costs['discriminator'])), \n",
    "         avg_costs['discriminator'], label='discriminator')\n",
    "plt.plot(range(len(avg_costs['generator'])),\n",
    "         avg_costs['generator'], label='generator')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeMAAAHVCAYAAADCVJOIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXWgVVXaxp81dmKgiChiK7Ze0c9WDEysQZ1RcUSxnVHH\nDmxRxh4Le+zuFrsQsLDFQEFC7M79/eF913n2PWvffXrvc3l+/9z3rnPOjrVzPesNF0URhBBCCJEd\nf8l6A4QQQoipHT2MhRBCiIzRw1gIIYTIGD2MhRBCiIzRw1gIIYTIGD2MhRBCiIzRw1gIIYTImKoe\nxs65Ps65d5xzY5xzR9Rqo4QQQoipCVdp0g/n3DQA3gWwEYBxAEYA2CmKojdrt3lCCCFEx2faKn7b\nC8CYKIo+AADn3I0A+gJIfBh37tw56tGjRxWrnPoYNWrUlCiK5qnktx25v+0l0jkX/PzHH38EAMw0\n00xlLbea/gaao89/+eUXb08//fQZbsmfdPRz/I8//vD2X/6S/cxgFv3Ng76ka7Y90vowaVBZzrps\nHbU+RqX2dzUP424APqH/xwFYre2XnHMDAQwEgO7du2PkyJFVrHLqwzk3tszv576/f//9d29PM800\n3i7npvXTTz8BAGacccbg56+99hoAYPnlly9r28rt79bfZN7n5fTdJ58ULtsFF1yw5HWkvQBVSkc8\nx5lvv/3W27PNNluGW/In1fb3iBEj+LOi74cevL/++qtvm2666Yq+m3RO2Xlt1zsAzDzzzEXf4xdM\nXv8MM8xQ9F2+//C18v333wMAZp111nb3JY2212Kp/V3317QoioZGUdQSRVHLPPNUPOAQJaL+bjzq\n88ai/m4s6u/GUM3IeDwAfq1eoLVNiHbh0TCTNqJLe+Nlyh0R15JqJTmmVOmsHGmtnNEwj0iSVAjR\nPnkYDdeS0Eifz/PQOc+j0bSRcej6SZpumjBhAgCga9euJW8/338+++yz4DYaPEoObR+Pgm25lcrc\n1YyMRwBY3Dm3sHNuegA7Ari7iuUJIYQQUyUVj4yjKPrNObc/gIcATAPgiiiK3qjZlgmB5LlQe4tN\nGmVnSTmj4fPOOw8AcOCBBwY/T3vLDo2cazkyD42Gf/jhB2+H5u9EHD6HWbF5/fXXi747++yze/ub\nb76p74ZVCG+jwecczw+H2vicCp2/fM6GPucRrI2Iyznn+bsh2f3TTz/19iyzzFK0XBuN8/p5uyq9\nJ1UjUyOKovsB3F/NMoQQQoipnez97IUQQoipnKpGxkIwFhrA0g5LQr/99huAQgwwEJe8Pv/8c2+/\n8sorAIALL7zQt22//fbeXnTRRQHEnZF4uYssskiFe9FYkuTpUgnJ2LUOPWqLpOny4GMUkqY5VChN\nmq7lFEQt4WsvdH4kSbcffvghAGDxxRcPfm77mLbf5fRFWhjVHHPM4du+++47b5uz2vzzz+/beLvM\nrjSOXyNjIYQQImP0MBZCCCEyRjJ1FZjsCgDTTjv1dCV7h7LkY/LUkCFDfNtyyy3n7RNOOAEA8PDD\nD/s2zga1xx57ePvtt98GEJe3Xn75ZW/ffPPNAIDOnTv7tq+++srb9coWVS9CchdQeuz1iy++6NvY\nW3XJJZcsaqslSy+9tLffeuutuqyjWrbYYgtv33vvvQ1ZJ3v88r2Bp2WGDx8OAFh11VVLXm4ezufQ\n9Z8U92/98M477/g2PmfmnXfeot9MnDjR23PPPTeAcGxyW9vg+7JNnQHAzz//DADo1KmTb+PrwpbF\nMjvvawg+HtVGdmhkLIQQQmRM0w3nPv74Y29379694es/7bTTvH3nnXd6m0cmISqtjpU1IceJpNhf\n+3yfffbxbTwq2GCDDQDE3yDZweGkk07y9jnnnAMAeOONQuh67969vb3//vsDiI+y2fHCnCjSMnXl\nhaQRT1qGoqWWWgoAMGXKFN/2xRdfFC2H+/mee+7xNv9us802AwAccUShGupZZ53l7ZBjTtpomEcm\n7NjXSBo1GgYKjkzcV5tssom3+XowJ8RmIxTTzte0jUCBwr2CR8Nffvmlt+28ZMc1Plct2xePYF99\n9VVvWzs/F3hb5ptvvqLtnzx5srfnnHNOb5eTxctgZy07tpWOkDUyFkIIITJGD2MhhBAiY5pOpi4n\nyX2IauP0dt11V2+ztBKSqVlase1mh6VmgNPYmTzF+81J8M3Jgh0oOBG7pZ5jCY8dM7hO6kcffQQg\nLlltvfXW3j7xxBMBJEufoZR8odKNjXLCYwcWc6pKgs9L2w/uJ3YCMkkwtL/8O054zw5Nod+xXHf6\n6ae3u61pZCVNNxJ2HDzqqKOKPn/ssce8zf1t15E5KTUjoXsoTw29++67AIAllljCt80111zetikV\nlnb594ceeigAYKWVVipaJlDoe76vcjrLMWPGFC2XHeauvPJKb9uzIanEawi+LkOFJsq5p2hkLIQQ\nQmSMHsZCCCFExjSdTJ0mLbMsYdU11l577ZJ/nwanQkuTnLkW7Lhx46pabyMwz0fuI5aJzXPw/PPP\n920mIzGcGo+9aY8//ngAcQ/GG2+80dssvy677LIACt7CQFzuW2ONNYq2lbHtZukoVHu0UfHhSdJ0\nWjy0yWAPPPCAb1t//fW9/eijjwKIp//klIvWZ7fccotvu/zyy9vdVq5KY2lJAWDddddt93dTK+zF\nP3r06KLPWZrmurzsidtMhCo0sVzL57JNPXGlL/6uTX3xdfrSSy95e+WVVwYQv0433XRTb99+++0A\n4tc29zdPyVhc9yOPPOLbjjvuOG/bFAN7YPOyLDXmAgss4NtCMdfyphZCCCGalKYbGafBk/M2uc9v\nahdffLG399xzz6LP0ybv+bvXX399ydt10EEHlfzdrAhle+L+sDfavffeu6gNKCgBgwcP9m1jx471\n9rBhwwDE35J55M3J4ldccUUAQJ8+fXwbj5JLHdHyMWxU7WMeHXEGshClKjU8GuB9f+ihhwDEVQXe\nT3N24djicmLeQxmSpmYsRpVHw3wNrLLKKgCAZ555Jvh7LnZy9NFHAwCuuOKKmm9nPeFz1s5FHuWz\nA5b1DauEfP6aMyffZ+zaBwpOn/fdd59vGzVqlLdbWloAhGPrAaBLly7enjRpUtH6n3rqKW/ffffd\nAOKjZXbY7datW9Hy+VqqVmXTyFgIIYTIGD2MhRBCiIzpEDK11cQE4jF/IQ4//HBvb7755gDiE/bl\nSJkmEQJA3759AcSdl4488khvn3rqqSUvN0+EZFSWfliesrhqk46AuJRvzhDs9MAyNccfHnbYYQDi\n0nk5tUGzJE2aZiopaDFgwABv//3vfwcQTw3L6QYtTSDL2P369fM2xxTbOcpOd0kJ/qcmOF/ACius\nAAB44YUXfJsVLQGAc889t91lscMiOyQ2E6FCJklpZ+1+yI5QfC5arDWf/zylYvHFnGPA5GSgMG1g\nxwUopNAEgCeeeMLb66yzDgDgzTff9G2cDnbQoEEA4g6M/LnFzHPddc6ZwLH8RjnXderI2Dl3hXNu\nsnPudWqbyzn3iHPuvda/c7a3DCGEEEIkU4pMfRWAPm3ajgAwLIqixQEMa/1fCCGEEBWQKlNHUfSU\nc65Hm+a+ANZrta8G8ASAw9FgTOLgGMsQHB/5+OOPV7VOlmjY09S8BVmOYa/hrOB0jybBlyWdpNTT\nZenY5B3ub/Y0NQ9UrifKNYwPPPBAbzdLtaVqKfVYfPDBB94eOnSot63S0ogRI3wbe/panx5zzDG+\njeU0Pj8sbv7SSy/1bdtss423TbLm1Ibl0Aw1pk1y3nbbbX0be/paTW2+znv27Fny8lnWtH5ea621\nKtvYjODjZ1NOSfcJ21+Or+ZpKpvmYunY5GSgcP6tttpqRcsECuciT7dwil6etjQvbE6pbHXTAWD8\n+PEAgJ122sm3cVWyhRdeGEB8Oi10Lld6flfqwNUliiIT1icC6JL0RefcQOfcSOfcSM5TLOqD+rvx\nqM8bi/q7sai/G0PVDlxRFEXOucTAxSiKhgIYCgAtLS01LerLjgAhbFRmzlW1gJ0Dll9+eW/bqPO5\n557zbfyGZyNndgapB237u1EZpoDC2zGPjCdOnOjtXr16ASiM5gDg3//+t7ezGDFVWzikdRkVn+OW\n1Sfk/MGwgxY7CdnbOsdLclJ9i41kpxMexfD5YY53nKGLRyRXXXUVAGC//fYrWn4p1Or41vOe8n//\n938A4ooOY+c2Z9+zLFGlwLH0Q4YMqWQTG07b/mYHPxulcvEYvi/byJNzBPDI2NQ0vg6tCAxQcBbl\nOGMeZd9www1Fv9lxxx29zapFSKnkEfV7770HAPjPf/7j284777yi3ySdG0al95RKR8aTnHNdW1fW\nFcDklO8LIYQQIoFKH8Z3A+jfavcHcFdtNkcIIYSY+kjVMJ1zN+BPZ63OzrlxAAYBGAzgZufcAABj\nAfRLXkL9SJML6pGIneVCjm+2tI///e9/fduaa67p7XrL01nBMa0mRbGMxXHbVsDgpptu8m1ZO/M0\nav1JiezT5OnQ79mpxIqg/Otf//JtoX3q3LlzcLksWZtjHTt1cZ1um3I44ohC8ARvV5qzX1awPMnO\nPyHSnNMsNpj39bLLLvP2brvt1u7vR44c6e1Sjz2fL2n3vEYQqlHN28WpKa1ACu8Dy7iW7pLjtnle\n+rXXXgMQd9Ll6UGbUmFpmZ229t1336J1sXMoOzvalM8uu+zi29hZq9Tzu9J7Sine1DslfNS7ojUK\nIYQQIkY+X2WFEEKIqYimSIcZqkObRL3kYKvGYlJG23VZjd5mTXtZDiwzbbfddt5OS0VqMtEdd9zh\n21hezQKuJlPPqQSWuCqJoeYpF65tXMtKVFYZitOdcmpAkx/5+H/99dfe5jrV7cEyeCO8/dOkacZi\nivkYWXUloHAcWb4/+OCDS14+76/JvZz+kevvGnmQphmWoe2Ys4cz5x6wezefM3zO2jXHKWT5/mD9\n/fPPP/s2Tjls/cWxxezNfeyxx3rbIhd4qpHzHNiyrAZzpZhXNhD3nk9DI2MhhBAiY5piZFzOSOLa\na6+t2Xp5NPLSSy8Vfc5v3Pa2z299w4cP97bF2GbtsFQL+M3UMhIBhX0LJZIHCm+m3G+cZH/LLbcs\nWgf34RprrOFte6OuNlNXszjWsbNPOfWIy8FGNOzUws40dm6zQ1TImSeNRsa+l8JWW23lbXME4tEo\nX9Om/vC5mlRLNwSrAgYXUwmNjBkeIWaVpY5HnqGsanzNW3w7j5w5JtnuBXZvAAoFGxg+Zzi23ZbL\nn3/66afe5mIc9jtWc1iZM4dbvr/xdhtJccTWvuiiixb9phQ0MhZCCCEyRg9jIYQQImPypRe1wZwp\n2IErje23397b1cp5xx9/fMnfNYnvn//8p2/jdJjNkCS/VJ5++mlvL7PMMt62QgIspa266qreNtn/\nkEMO8W2cju6cc87xtsVrn3/++cH1muNI1uk0G0Ut0namYXLs//73P9/G57DJk+yoxTJ/2vWW1+PD\n9XGfeeYZAHEpns9x6wOWL1mWLedeZWlLWaZOIw8FVNKcBrkPLL6di23wNJU5ULJTFS/f7iXsVBWS\nhrmQCqck7t27EIFr8fnsoMjTBjYlwzH5aYUgQtclT2+Wc7w0MhZCCCEyRg9jIYQQImNyLVNb6rhK\nZSCTkjiWNA2WQ9hT+MwzzwSQnGLTtuvhhx/2bWeddVbJ620k1UqeLPOwJ6qlruN0jewtbTV3uXYp\n1xY1mRsoeLNOmTLFt3HlIfOy3nXXXYPblTcqTWloXqbsLTpmzBhvL7vssiUtJym2l68nS23KtZE5\nvatJhuyNyvtl1xtfr3lNkcnw9WC1hdPSfHL89SWXXOLtI488EkD8vE3i3nvvLX9jc0CSTBv63PqR\nPZQ5DtmYf/75g7+3c5WPAUve77//PoB4mlGWmVkmtm3hFJfs+Wzt5cTuh/qi0rjw/F8pQgghRAdH\nD2MhhBAiY3ItU1uauFCgPMMJES666CJvc/WN9rj99tu93adPH2+zV+npp58OIJ76LpTc4tFHHy1p\nnVlSqVeryTyLLbZY8HPzrL3wwgt9G3udrr/++gCA1Vdf3bdx0gg+zraN//jHP3wbV8kyb1eWvC3d\nJpA/ebRS6cq8yTkRAkvDVmXIpgiAeAIFq1rD0y/8e/YatsQ2Vl0LiCdQsCmaeeed17ddffXV3rak\nCUnnR14JXQ9J54/dK7hamd0bgPISgLA026zY+cMe0ixJm8zM1znLzPb7d99917dxVSa7J/Axuuaa\na7zds2dPAMDGG2/s2+66q1DRl1NrWuUnvm9zghu7V1V6f7TflTOVyuTrjiWEEEJMheR6ZHzyyScD\niI92+c3ziSeeAACsu+66wd+//fbbAOKOVKeddpq3OSY4xE47FapHWnwhx7Nxwn5LwznffPP5Nn7D\n45FLVlQb62yjBXYgSls+OwtZe9IoMeQMwTGehx12mLetZvL48eN927hx47y9wAILxLY5K6x28w47\n7FDR70844QQA8dEs96mdj2effbZvCxWV4BrToZEHUBgRs9LEo2SLi+XUsBzXb+vlgiE88ugIbLPN\nNkVtVlMXSB8V5dnJsBp4tMmx53b98WiYr1m7Tlm5YQXMlMZRo0b5tq233trbpsJwrLg50QHxnAem\nlLLzHV9X1cbBV5vXQiNjIYQQImP0MBZCCCEyJtcytU2os9RQjhRgMrf9LRderzkKseR9xhlneNsc\nFFiOyYM0zVQrw9i+cdWVvn37ettqvLKMyjKoydPsYMTfnTRpkrfNIYQd4lh+tfPgsssuC25LSJ5O\nix2tByZPlxPb/e2333r7vPPOAwDstddevo371Pbj3HPP9W0cV299ct999/m2gw46yNsWPw8UzmE+\nPldccYW3LZ52xRVXLFo/UJhC4tjxEI1I7VkvQtu7++67e/ukk05q9/d5SGdZLXz87JxJO6Z87bGj\npd1T+Jw/8MADi77LDnPmiMXLZRmb79t8LVjKTXM0BOJ1kNPORbvvcdUqxn4/efJk38bpftNIvSM5\n5xZ0zj3unHvTOfeGc+6fre1zOececc691/q3tMriQgghhIhRyvDgNwCHRFHUE8DqAPZzzvUEcASA\nYVEULQ5gWOv/QgghhCiTVJk6iqIJACa02t86594C0A1AXwDrtX7tagBPADi8lhtnstdHH31Uy8W2\nC8spHAd42223AYh7/XF6RpNVTzzxRN923HHH1WszM8GkKJY8OY7YPH/Nyx2Ix5zut99+AOIyFFdr\neeONN7xtUtSGG27o2ziW0eJrOc44TQJslDQdKgBfjhzL0lmnTp0AAJtuuqlvYy9+OyYTJ070bUsu\n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\nq/htLwBjoij6AACcczcC6Asg8WHcuXPnqEePHlWscupj1KhRUyotd9YM/f377797e5pppin5dz/9\n9BMAYMYZZwx+/s033wAAZp999rK2p5r+Bpqjz+vFRx99BAAod/87+jmeN5qpv+3+UM69IY3ffvvN\n29NOW80jMM4ff/wBAPj22299W6dOnUru72q2pBuAT+j/cQBWa/sl59xAAAMBoHv37hg5cmQVq6we\nVgKccxluSWk458amfyv2/Vz1dxpff/21tzt16uRtO7H/8pfwTMrbb78NAFhqqaWCnz/66KMAgA03\n3DD4uZ0Hbc+Bcvu79TdN1ef1YvfddwcAXHHFFWX9rqOf43mjlv2ddp2GsN+U8rsvv/wSADDnnHO2\nuyxeTtoL/ueff+7tueaay9tpzwO7Z/D28/J/+OEHAMBjjz3m27bYYouS+7vuDlxRFA2NoqgliqKW\neeapeMAhSkT93XjU541F/d1Y1N+NoZqR8XgAC9L/C7S21Yyk0Uupn4fIajRcybY2G5XsI4+GmdAb\n89ixhRfMpBGxkTQiNjrycciKckfEtaJesmMlVCur2ugKAGaeeeaabhNQG7n3b3/7m7evv/76os9Z\nfXzllVcAACuttJJvK2cUPdtss7X7eWhZSfs4adIkAECXLl1822effebt0IsGK3c25ZXkZ2XHa/PN\nN293m5OoZmQ8AsDizrmFnXPTA9gRwN1VLE8IIYSYKqn4NTKKot+cc/sDeAjANACuiKLojZptGQqj\nl9NPP923HX744UWft7ONJX0v9Jtyf5dGXkditdzfeu/jQgstVPZvypmfEs1J1qNhxkZllY7WQ6Ph\nas/hWjo/AeHRMMP3AR4Rlwrfk0J9xyN96w9e5wsvvODtF1980dsHHnhg0fLnmGOOouXzseORua0j\n6XhWq4pUdRZHUXQ/gPurWYYQQggxtaOhghBCCJEx+dF32oGl6TQuueQSb++1115lryuvcnK9qHZ/\n8x4qNrVL0ya5lSKVTg1OhvXg559/9vb0008PINnJJ3S9vPbaa75t+eWXL/pNns9hk9B//fVX3zbD\nDDOU/HtzoGLnqbTzL00GXn311b29wgorePu7774DAAwfPty39e7d29t2HJZeemnfFur7pHtetdMB\n+T3KQgghxFSCHsZCCCFExjSFTM18+OGH3l544YUBxL3fttpqq6LfpMWSiWTSZGhJmrWHvUXfffdd\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fdae4175710>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "####################################\n",
    "### RELOAD & GENERATE SAMPLE IMAGES\n",
    "####################################\n",
    "\n",
    "\n",
    "n_examples = 25\n",
    "\n",
    "with tf.Session(graph=g) as sess:\n",
    "    saver.restore(sess, save_path='./gan.ckpt')\n",
    "\n",
    "    batch_randsample = np.random.uniform(-1, 1, size=(n_examples, gen_input_size))\n",
    "    new_examples = sess.run('generator/generator_output:0',\n",
    "                            feed_dict={'generator_input:0': batch_randsample,\n",
    "                                       'dropout:0': 0.0,\n",
    "                                       'is_training:0': False})\n",
    "\n",
    "fig, axes = plt.subplots(nrows=5, ncols=5, figsize=(8, 8),\n",
    "                         sharey=True, sharex=True)\n",
    "\n",
    "for image, ax in zip(new_examples, axes.flatten()):\n",
    "    ax.imshow(image.reshape((dis_input_size // 28, dis_input_size // 28)), cmap='binary')\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
